<?php
/*
 * CompanyController
 *
 */
class CompanyController extends AbstractModule implements IObservable, INameable {

    private $observers;
    private $model_Company;
    private $view;
    private $model_LR;
    public function __construct() {
        parent::__construct();
        
        $this->setActiveSubmodule('blocklr', 'leftblock');
        $this->setAllowedPaths(array(
            'index',
            'create',
            'profile/%num%',
            'edit/%num%'
        ));

        $this->model_Company = new CompanyModel();
        $this->model_LR = new LRModel();
        $this->view = new CompanyView();
        $this->addObserver($this->messagesobserver);
    }
    /**
    * Каталог Company/index
    * Вывод всех компаний с пагинацией
    * @return boolean 
    */
    public function index() {
        
        //инклудим class.Pager, class.Searcher
        $this->load->library('Pager');
        $this->load->library('Searcher');

        $searcher = new Searcher(array(array('field' => 'name', 'type'=>'match'), array('field' => 'address', 'type'=>'std')), $_GET);
        
        $pager = new Pager(3, @$_GET['page'], @$_GET['pager_id']);
        
        $companies = $this->model_Company->getAllCompaniesByCriteria($pager, $searcher);

        $pagedata = array();     
        $pagedata[] = array('data'=>CompanyView::getSearchForm(null), 'region'=>'searcher');
        $pagedata[] = array('data'=>CompanyView::getTableWithCompanies($companies), 'region'=>'company-table');
        $pagedata[] = array('data'=>CompanyView::getPager($pager), 'region'=>'pager');
        $this->output($pagedata);

        return true;
    }
   /**
    * Каталог Company/create
    * Создание компании
    * @return boolean 
    */
    public function create() {
        
        if (@$_POST['submit']) {
            //если удалось добавить компанию, обновить поле пользователя ownerof
            if(($id = $this->model_Company->insertCompany($_POST)) && ($this->model_LR->updateUserOwnerof($id, $this->user->user_id)))
            {
                $this->fireEvent('message', array('message'=>"Ваша компания добавлена!"));
                $this->user->ownerof = $id;
                return $this->doAction($this->router->getAction('Company/Profile'), array($id));
            }
            else
            {
                $this->fireEvent("Возникла ошибка!");
            }
        }
        //если юзер не залогинен, возвращаем 404
        if(!$this->user->isLogged) return false;
        //если у юзера уже есть компания, 404
        if($this->user->ownerof) return false;

        $pagedata = array();
        $pagedata[] = array('data'=>CompanyView::getCompanyCreationForm(array(), "create"), 'region'=>'content');
        $this->output($pagedata);
        return true;
    }
    
    /**
     * Реализация IName
     * @param type $path
     * @return string|boolean 
     */
    public static function getPageName($path) {
        $args = array();
        parent::preparePath($path, $args);
        switch ($path) {
            case 'company/profile/%':
                $registry = Registry::getInstance();
                $model = new CompanyModel;
                $data = $model->getNameById($args[0]);

                return str_replace('%company', $data, '&laquoСтраница компании %company&raquo');
            case 'company/profile':
                return 'Профайлй компаний';
            case 'company':
                return 'Компании';
            default:
                return false;
        }
    }
    /**
     * Реализация IObservable
     * @param type $eventType
     * @param type $data 
     */
    public function fireEvent($eventType, $data) {

        if (is_array($this->observers)) {
            foreach ($this->observers as $objObserver) {
                $objObserver->notify($eventType, $data);
            }
        }
    }
    /**
    * Реализация IObservable
    * @param IObserver $obs 
    */
    public function addObserver(IObserver $obs) {
        $this->observers[] = $obs;
    }
    /**
     * Каталог Company/profile
     * Профайл компании
     * @return boolean
     */
    public function profile() {
        $args = func_get_args();
        $id = $args[0];
        //если id компании взятый из аргументов строки не число или меньше нуля -> 404
        if(!is_numeric($id) || $id<0) return false;
   
        if(!($owner = $this->model_Company->getCompanyOwner($id))) return false;
        //если нет компании с таким id в базе ->404
        if(!($company = $this->model_Company->getCompanyById($id))) return false;

        //подключаем к странице модули комментариев и кнопку 'добавить в избранное'
        if($this->user->isLogged)
        {
        $this->setActiveSubmodule('comments');
        $this->setActiveSubmodule('favoritesadder');
        }
        
        $company['owner'] = $owner;
        
        $pagedata = array();
        $pagedata[] = array('data'=> CompanyView::getCompanyProfile($company, (($id==$this->user->ownerof) && $this->user->isLogged)), 'region'=>'content');
        $this->output($pagedata);
        return true;
    }
    
    /**
     * Валидатор - формы edit
     * @param type $data
     * @return boolean 
     */
    private function editValidate($data) {
        return true;
    }
    /**
     * Обработчик - формы edit
     * @param type $data
     * @return boolean 
     */
    private function editSubmit($data) {
        return true;
    }  
     /**
     * 
     * Каталог Company/edit
     * Профайл компании
     * @return boolean
     */
    public function edit() {
        $args = func_get_args();
        $id = $args[0];
        //если не залогинен, 404
        if(!$this->user->isLogged) return false;
        
        if(!is_numeric($id) || $id<0) return false;
        //если нет такой компании, 404
        if(!($company = $this->model_Company->getCompanyById($id))) return false;
        //если юзер не владелец этой компании, 404
        if($company['company_id']!=$this->user->ownerof)  return false;
        
        if(@$_POST['submit'])
        {
            if ($this->editValidate($_POST)) {
                if ($this->editSubmit($_POST)) {
                    $this->fireEvent('message', array('message'=>"Данные успешно изменены!"));
                }
            }
        }
        
        $pagedata = array();
        $pagedata[] = array('data'=>CompanyView::getCompanyCreationForm($company, 'edit'), 'region'=>'content');
        $this->output($pagedata);
        return true;

    }

    public function delete() {
        
    }

    public function install() {
        
    }

//    public function hook_profile($args) {
//        
//    }

}

?>